package midend.IR_Optimizer;

import midend.IR_Instruction.Branch_Instruction;
import midend.IR_Instruction.Instruction;
import midend.IR_Instruction.Phi_Instruction;
import midend.IR_Module;
import midend.IR_Value.IR_BaseBlock;
import midend.IR_Value.IR_FuncBlock;
import midend.IR_Value.IR_Value;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class OptimizationManager {
    private LoopInvariantCodeMotion licm;
    //private LoopFusion LF;
    private IR_Module ir_module;
    private Map<IR_BaseBlock,IR_BaseBlock> replacemap;
    private Map<IR_BaseBlock,IR_BaseBlock> phireplacemap;

    public OptimizationManager(IR_Module ir_module) {
        this.licm = new LoopInvariantCodeMotion();
        //this.LF = new LoopFusion();
        this.ir_module = ir_module;
    }

    /**
     * 对整个模块进行循环不变式外提优化
     */
    public void optimizeModule() {
        // 首先构建CFG
        ir_module.buildCFG();

        // 对每个函数进行优化
        for (IR_FuncBlock function : ir_module.getFuncBlocks()) {
            //LF.optimizeFunction(function);
            // 执行循环不变式外提
            licm.optimizeFunction(function);

            // 打印优化结果
            //licm.printLoopInfo();
        }
    }
}
